﻿// Namespace
var BalloonShooter = {};

// Constantes
BalloonShooter.LARGURA_FECHO = 0.12;
BalloonShooter.ALTURA_FECHO = 0.10;
BalloonShooter.CURVA_FECHO = 0.13;
BalloonShooter.RAIO_GRADIENTE_CIRCULO = 3;
BalloonShooter.VELOCIDADE_INICIAL = 50;

// Construtor
BalloonShooter.Balloon = function (ctx, posXCentro, posYCentro, raio, cor) {
    this.contexto = ctx;
    this.posXCentro = posXCentro;
    this.posYCentro = posYCentro;
    this.raio = raio;
    this.tomEscuroCor = cor.corEscura;
    this.tomClaroCor = cor.corClara;
    this.velocidade = BalloonShooter.VELOCIDADE_INICIAL;
}

// Desenha o balão
BalloonShooter.Balloon.prototype.desenha = function () {
    var contexto = this.contexto;
    var posXCentro = this.posXCentro;
    var posYCentro = this.posYCentro;
    var raio = this.raio;

    var fundoBalaoY = posYCentro + raio;

    // Inicia o desenho do balão
    contexto.beginPath();
    contexto.arc(posXCentro, posYCentro, raio, 0, Math.PI * 2, true);

    // Cria o gradiente da cor do balão
    var distanciaGradiente = (raio / 3);
    var gradiente = contexto.createRadialGradient(posXCentro + distanciaGradiente, posYCentro - distanciaGradiente,
										BalloonShooter.RAIO_GRADIENTE_CIRCULO,
										posXCentro, posYCentro, raio);

    gradiente.addColorStop(0, this.tomClaroCor);
    gradiente.addColorStop(0.7, this.tomEscuroCor);

    contexto.fillStyle = gradiente;
    contexto.fill();
    // Finaliza o desenho do balão

    // Desenhao fecho do balão
    var larguraMeioFecho = (raio * BalloonShooter.LARGURA_FECHO) / 2;
    var alturaFecho = (raio * BalloonShooter.ALTURA_FECHO);
    var curvaAlturaFecho = (raio * BalloonShooter.CURVA_FECHO);

    contexto.beginPath();
    contexto.moveTo(posXCentro - 1, fundoBalaoY);
    contexto.lineTo(posXCentro - larguraMeioFecho, fundoBalaoY + alturaFecho);
    contexto.quadraticCurveTo(posXCentro, fundoBalaoY + curvaAlturaFecho, posXCentro + larguraMeioFecho, fundoBalaoY + alturaFecho);
    contexto.lineTo(posXCentro + 1, fundoBalaoY);

    contexto.fill();
}

// Verifica se o ponto clicado esta contido na área do balão
BalloonShooter.Balloon.prototype.verificaColisao = function (x, y) {
    var raio = this.raio;

    var dx = Math.abs(x - this.posXCentro)
    var dy = Math.abs(y - this.posYCentro)
    var distancia = (dx * dx) + (dy * dy);

    if (dx + dy <= raio)
        return true;

    if (distancia <= (raio * raio))
        return true;

    return false;
}

// Par de cores utilizadas no preenchimento do balão
BalloonShooter.Cor = function (clara, escura) {
    this.corClara = clara;
    this.corEscura = escura;
}